package cn.tedu.api;

import java.util.Objects;

/*本类用于顶级父类object的入门案例*/
public class TestObject {
    public static void main(String[] args) {
        student s=new student();
        student s1=new student("海绵宝宝",3);
        student s2=new student("海绵宝宝",3);
        /*hashCode
        * 返回对应对象的int类型的哈希码值
        * 本方法地球不同对象返回的哈希码值不同
        * 可以根据哈希码值区分不同的对象*/
        System.out.println(s.hashCode());//961
        System.out.println(s1.hashCode());//1101528838
        System.out.println(s2.hashCode());//1101528838
        /*object中tostring()的默认实现:对象的地址值[对象类型@十六进制的哈希码值]*/
        System.out.println(s);
        System.out.println(s1);
        /*equals()
        *equals()的默认实现使用的是==比较
        * ==比较的是左右两边的值,如果是基本类型,比较的是字面值,比如1和2 ,2和3
        * 如果是引用类型,不加的是引用类型变量保存的地址值
        * 子类重写了equals9)与hashcode()以后,比较的就是对象的类型+属性+属性值 */
        System.out.println(s1.equals(s2));


    }
}
class student{
    String name;
    int age;

    public student() {
        System.out.println("无参构造");
    }

    public student(String name, int age) {
        this.name = name;
        this.age = age;
        System.out.println("全参构造");
    }

    @Override
    public String toString() {
        return "student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
/*equals与hashcode逻辑要保持一致,要重写都重写,要不重写都不重写
* object默认实现hashcode的哈希码值根据地址值生成
*              equals的底层使用==比较两个对象的地址值
* student类重写后:hashcode的哈希码值根据重写后传入的对象的属性生成
*               equals比较两个对象的类型+所有属性与属性值*/
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        student student = (student) o;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }
}